# -*- coding: utf-8 -*-

# === メッセージ管理用コントローラ
class Portal::MessagesController < ApplicationController
  before_filter :check_message,
                  :only => [:show, :edit]

  # === メッセージ一覧の表示
  def index
    paginate_opts = {:per_page => current_user.setting.message_per_page,
                     :page => params[:page]}

    if params[:folder_id]
      folder = MessageFolder.find(params[:folder_id])
      unless folder.user == current_user
        redirect_to "/", :notice => "フォルダIDが不正です。"
        return false
      end
      @messages = folder.messages
    else
      @messages = current_user.messages
    end
    @messages = @messages.paginate(paginate_opts)
    @folders = current_user.message_folders
  end

  # === 個別メッセージの詳細表示
  def show
    @message.set_read_flag(current_user)
    if request.mobile?
      messages = current_user.messages
      cm_index = messages.count(:conditions => ["message_recipients.created_at <= ?", @message.created_at]) - 1
      if cm_index <= 0
        tmp, @next_message = messages.offset(cm_index).limit(2)
        @prev_message = nil
      else
        @prev_message, tmp, @next_message =
          messages.offset(cm_index - 1).limit(3)
      end
    end
  end

  # === 新規メッセージ送信用フォームの表示
  def new
    @message = Message.new
    @format_type = current_user.setting.message_format_type
    if params[:original_message]
      org_message = Message.find(params[:original_message])
      @message.set_attr(org_message)
      @format_type = org_message.format_type
    end
  end

  # === 返信メッセージ送信用フォームの表示
  def edit
    @message.set_reply_fields
    @to_list = @message.user.nick_name
    @cc_list = nil
    @format_type = @message.format_type
  end

  # === 新規メッセージ送信の実行
  def create
    @to_list = params[:to_list]
    @to_list = @to_list.join(',') if @to_list.is_a? Array
    @cc_list = params[:cc_list]
    @cc_list = @cc_list.join(',') if @cc_list.is_a? Array
    @message = Message.new(:subject => params[:subject],
                           :body => params[:body],
                           :from_user_id => current_user.id,
                           :format_type => params[:format_type])

    @message.save_attachments(params[:uploaded_data])

    unless @message.set_recipients(@to_list, @cc_list)
      flash[:notice] = "不正な宛先が設定されています。"
      render :action => "new"
      return false
    end

    if @message.save
      redirect_to portal_messages_path, :notice => "メッセージを送信しました。"
    else
      render :action => "new"
    end
  end

  # === 返信メッセージ送信の実行
  def update
    @to_list = params[:to_list]
    @cc_list = params[:cc_list]
    @message = Message.new(:subject => params[:subject],
                           :body => params[:body],
                           :from_user_id => current_user.id,
                           :reply_to_id => params[:reply_to_id],
                           :format_type => params[:format_type])

    @message.save_attachments(params[:uploaded_data])

    unless @message.set_recipients(@to_list, @cc_list)
      flash[:notice] = "不正な宛先が設定されています。"
      render :action => "edit"
      return false
    end

    if @message.save
      redirect_to portal_messages_path, :notice => "メッセージを送信しました。"
    else
      render :action => "edit"
    end
  end

  # === 受信済みメッセージの削除実行（論理削除）
  def destroy
    recipient = MessageRecipient.where(:message_id => params[:id],
                                       :user_id => current_user.id).first
    recipient.delete_flag = true
    notice_message = "メッセージの削除に失敗しました。"

    if recipient.save
      notice_message = "メッセージを削除しました。"
    end
    redirect_to portal_messages_path, :notice => notice_message
  end

  private

  # === 処理対象メッセージレコードの取得
  def check_message
    @message = Message.find(params[:id])
    unless @message.users.include?(current_user)
      redirect_to portal_messages_path,
                   :notice => "該当メッセージを表示できませんでした。"
      return false
    end
    return true
  end
end
